package cn.bone.demo01;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

/**
 * Created by Administrator on 2018/1/29.
 */
public class TimeServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端主动连接服务器的连接后,这个通道就是活跃的
     * 也就是客户端与服务器建立了通信通道,并可以传输数据
     * @param ctx
     * @throws Exception
     */
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString()+" channelActive");
    }

    /**
     * 当客户端主动断开服务器的连接后,这个通道就是不活跃的
     * 也就是说客户端与服务器关闭了通信通道,并且不可以传递数据
     * @param ctx
     * @throws Exception
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString()+" channelInactive");
    }

    /**
     * 从通道读取数据,也就是服务端接收客户端发来的数据
     * 但是这个数据在不进行解码时他是ByteBuf类型
     * @param ctx
     * @param msg
     * @throws Exception
     */
    public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception{

//        System.out.println(msg.getClass());
//        ByteBuf buf = (ByteBuf)msg;
//        byte[] req = new byte[buf.readableBytes()];
//        buf.readBytes(req);
//        String body = new String(req,"UTF-8");
//        System.out.println("服务端接收到的请求:"+body);
//
//        ByteBuf resp = Unpooled.copiedBuffer("我是服务器,我收到了你的请求".getBytes("UTF-8"));
//        ctx.writeAndFlush(resp);
        if(msg instanceof String){
            String m = (String)msg;
            System.out.println("服务端接收到的请求:"+m);
            ByteBuf resp = Unpooled.copiedBuffer("我是服务器,我收到了你的请求".getBytes("UTF-8"));
            ctx.writeAndFlush(resp);
        }

       /* //使用了字符串解码器,这里可以直接使用了
        String body = (String)msg;
        System.out.println("服务端接收到的请求:"+body);*/

    }

    /**
     * 在通道读取完成后会在这个方法里面通知,对应的可以做刷新操作
     * @param ctx
     * @throws Exception
     */
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    /**
     * 抓住异常,当发生异常的时候,可以做一些响应的处理,比如打印日志,关闭连接等
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("出现异常:\n"+cause.getMessage());
        ctx.close();
    }
}
